TimesTenでは、重複したパラメータを含むSQL文は解析されるため、異なるパラメータ名のみが別のパラメータとしてみなされます。バインドは、パラメータ名が最初に出現した位置に基づいて行われます。重複した各パラメータは同じ値にバインドされます。
次の問合せを考えてみます。
SELECT * FROM employees
WHERE employee_id < :a AND manager_id > :a AND salary < :b;
Oracleでは、パラメータa
が2回出現すると、別のパラメータとしてみなされます。ただし、Oracle Call Interface(OCI)では、a
を両方ともOCIBindByPosへの1つのコールとバインドすることができます。
OCIBindByPos(..., 1, ...); /* both occurrences of :a */
OCIBindByPos(..., 3, ...); /* occurrence of :b */
また、OCIでは2つのa
を別々にバインドすることもできます。
OCIBindByPos(..., 1, ...); /* first occurrence of :a */
OCIBindByPos(..., 2, ...); /* second occurrence of :a */
OCIBindByPos(..., 3, ...); /* occurrence of :b */
両方の場合で、パラメータb
は位置3に存在するとみなされていることに注意してください。
TimesTenでは、2つのa
は1つのパラメータとみなされるため、別々にバインドできません。
SQLBindParameter(..., 1, ...); /* both occurrences of :a */
SQLBindParameter(..., 2, ...); /* occurrence of :b */
TimesTenでは、パラメータb
は位置3ではなく、位置2に存在するとみなされることに注意してください。
SQLNumParams ODBC関数は、この例のパラメータ数の場合、2を返します。
また、OCIでは、OCIBindByNameを使用して位置ではなく、名前でバインドすることもできます。 TimesTen ODBCでは、名前によるパラメータのバインドをサポートしていません。